In [3]:
import pandas as pd, numpy as np, scipy
import seaborn as sns
import matplotlib.pyplot as plt
In [4]:
plt.rcParams.update({'figure.max_open_warning': 0})
In [5]:
df = pd.read_csv("../data/Repayments.csv", delimiter=';')
static = pd.read_csv("../data/Static.csv", delimiter=';')
In [6]:
df.head()
Out[6]:
CONTRACT_ID PERIOD_ID REPAYMENT_SCHEDULED REPAYMENT_ACTUAL
0 17228104 1 19.76 19.76
1 17228104 2 19.76 19.76
2 17228104 3 19.76 19.76
3 17228104 4 19.76 19.76
4 17228104 5 19.76 172.76
In [7]:
df[df['CONTRACT_ID'] == 17464703].sum()
Out[7]:
CONTRACT_ID            1.467035e+09
PERIOD_ID              3.570000e+03
REPAYMENT_SCHEDULED    7.650000e+02
REPAYMENT_ACTUAL       7.649900e+02
dtype: float64
In [8]:
pivot_scheduled = df.pivot_table(index=['CONTRACT_ID'], columns=['PERIOD_ID'], values=['REPAYMENT_SCHEDULED']).replace(0, np.nan)
In [9]:
pivot_actual = df.pivot_table(index=['CONTRACT_ID'], columns=['PERIOD_ID'], values=['REPAYMENT_ACTUAL']).replace(0, np.nan)
In [10]:
print(pivot_scheduled.shape)
print(pivot_actual.shape)
(3792, 120)
(3792, 20)
In [11]:
pivot_scheduled.head()
Out[11]:
REPAYMENT_SCHEDULED
PERIOD_ID 1 2 3 4 5 6 7 8 9 10 ... 111 112 113 114 115 116 117 118 119 120
CONTRACT_ID
17228104 19.76 19.76 19.76 19.76 19.76 19.76 14.65 14.81 14.97 15.13 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
17237409 28.47 28.47 28.47 28.47 28.47 28.47 28.47 28.47 28.47 28.47 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
17276280 25.48 25.48 25.48 25.48 25.48 25.48 18.89 19.10 19.31 19.51 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
17282809 15.10 15.10 15.11 15.10 15.11 15.11 11.20 11.32 11.44 11.57 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
17283247 26.55 26.55 26.55 26.55 26.55 26.55 19.69 19.90 20.12 20.33 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN

5 rows × 120 columns

In [12]:
pivot_actual.head()
Out[12]:
REPAYMENT_ACTUAL
PERIOD_ID 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
CONTRACT_ID
17228104 19.76 19.76 19.76 19.76 172.76 268.41 15.30 80.32 67.09 9.79 22.95 NaN 64.64 70.76 59.29 NaN 28.68 NaN 17.21 15.30
17237409 28.69 29.07 29.07 29.07 29.07 29.07 29.07 29.07 29.07 29.07 29.07 193.12 NaN NaN NaN NaN NaN NaN NaN NaN
17276280 25.48 25.48 25.48 25.48 25.48 25.48 18.89 19.10 1338.35 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
17282809 15.10 15.10 15.11 15.10 15.11 831.00 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
17283247 26.77 26.33 26.55 26.76 26.76 26.13 NaN 19.90 20.12 20.33 21.10 20.23 21.00 NaN 21.46 21.69 21.93 25.0 NaN 23.04

scheduled paments

In [13]:
def print_contract(contract_id):
    pivot_scheduled
    plt.figure()
    pivot_scheduled.loc[contract_id].T.plot(figsize=(12, 12), linewidth = 5)
    pivot_actual.loc[contract_id].T.plot(figsize=(12, 12), linewidth = 5)
    plt.ylim(ymin=0)
    title = ", ".join(["{} - {}\n".format(k, list(v.values())[0]) for k, v in static[static['CONTRACT_ID'] == pivot_actual.loc[contract_id].name].to_dict().items()])

    plt.title(title)
In [14]:
print_contract(17283247)
In [20]:
for i in np.random.choice(pivot_actual.shape[0], 100, replace=False):
    print_contract(pivot_scheduled.index[i])
    
In [ ]: